// services/deepseekService.js
import axios from 'axios';
import { ElMessage } from 'element-plus';

const DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions';

export class DeepSeekService {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.client = axios.create({
      baseURL: DEEPSEEK_API_URL,
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      },
      timeout: 30000
    });
  }

  async analyzeCode(code, language, context = {}) {
    if (!this.apiKey) {
      throw new Error('DeepSeek API密钥未配置');
    }

    const prompt = this.generateCodeReviewPrompt(code, language, context);
    
    try {
      const response = await this.client.post('', {
        model: 'deepseek-coder',
        messages: [
          {
            role: 'system',
            content: '你是一个专业的代码审查助手，专注于代码质量、安全性和最佳实践。提供详细、专业的审查报告，使用中文回复。'
          },
          {
            role: 'user',
            content: prompt
          }
        ],
        temperature: 0.1,
        max_tokens: 3000
      });

      return response.data.choices[0].message.content;
    } catch (error) {
      console.error('DeepSeek API Error:', error);
      ElMessage.error('DeepSeek API调用失败: ' + error.message);
      throw new Error('代码审查服务暂时不可用');
    }
  }

  generateCodeReviewPrompt(code, language, context) {
    return `
请对以下 ${language} 代码进行专业的代码审查：

**代码文件**: ${context.filePath || '未知文件'}
**相关PR**: ${context.prTitle || '无标题'}
**代码行数**: ${context.additions || 0} 新增, ${context.deletions || 0} 删除

**代码内容**:
\`\`\`${language}
${code.substring(0, 3000)} ${code.length > 3000 ? '... (内容过长已截断)' : ''}
\`\`\`

请从以下方面进行详细审查：
1. 代码质量和可读性（命名规范、结构清晰度）
2. 潜在的安全漏洞（SQL注入、XSS、敏感信息泄露等）
3. 性能问题（循环优化、内存泄漏、算法复杂度）
4. 是否符合最佳实践和设计模式
5. 错误处理是否恰当
6. 代码风格一致性
7. 测试覆盖率建议

请提供结构化的中文审查报告，包括：
- 总体评价和评分（1-10分）
- 按严重程度分类的问题列表
- 具体的改进建议和代码示例
- 安全建议和性能优化方案

报告格式要求：
## 代码审查报告

### 总体评价
[详细总体评价]

### 🔴 严重问题（需要立即修复）
- [问题描述和建议]

### 🟡 一般问题（建议修复）
- [问题描述和建议]

### 🔵 优化建议（可选改进）
- [改进建议]

### 安全注意事项
- [安全相关建议]

### 性能优化建议
- [性能相关建议]

### 总体评分: X/10
    `;
  }

  parseReviewReport(reportText) {
    const sections = {
      overall: '',
      criticalIssues: [],
      warningIssues: [],
      suggestions: [],
      securityNotes: [],
      performanceSuggestions: [],
      score: 0
    };

    const lines = reportText.split('\n');
    let currentSection = '';

    for (const line of lines) {
      const trimmedLine = line.trim();
      
      if (trimmedLine.includes('总体评价')) {
        currentSection = 'overall';
      } else if (trimmedLine.includes('严重问题')) {
        currentSection = 'critical';
      } else if (trimmedLine.includes('一般问题')) {
        currentSection = 'warning';
      } else if (trimmedLine.includes('优化建议')) {
        currentSection = 'suggestion';
      } else if (trimmedLine.includes('安全注意事项')) {
        currentSection = 'security';
      } else if (trimmedLine.includes('性能优化建议')) {
        currentSection = 'performance';
      } else if (trimmedLine.includes('总体评分')) {
        const scoreMatch = trimmedLine.match(/总体评分:\s*(\d+(?:\.\d+)?)\/10/);
        if (scoreMatch) {
          sections.score = parseFloat(scoreMatch[1]);
        }
        currentSection = '';
      } else if (trimmedLine && currentSection) {
        if (trimmedLine.startsWith('- ') || trimmedLine.startsWith('• ') || trimmedLine.startsWith('* ')) {
          const content = trimmedLine.replace(/^[-•*]\s*/, '').trim();
          this.addToSection(sections, currentSection, content);
        } else if (currentSection === 'overall') {
          sections.overall += trimmedLine + '\n';
        }
      }
    }

    sections.overall = sections.overall.trim();
    return sections;
  }

  addToSection(sections, section, content) {
    switch (section) {
      case 'critical':
        sections.criticalIssues.push(content);
        break;
      case 'warning':
        sections.warningIssues.push(content);
        break;
      case 'suggestion':
        sections.suggestions.push(content);
        break;
      case 'security':
        sections.securityNotes.push(content);
        break;
      case 'performance':
        sections.performanceSuggestions.push(content);
        break;
    }
  }
}